package com.wang.cloud.common.auth.enums;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.wang.cloud.common.core.exception.ServiceException;
import lombok.Getter;

import java.util.*;

/**
 * 定义-系统的多体系账号的登陆类型（每个体系的账号对应一个登陆类型）
 *
 * @author wang ye
 * @date 2024/5/27
 */

@Getter
public enum LoginTypeEnum {
    /**
     * 用于：普通用户端-账号体系的的登录、权限认证
     * sys_user 会话对象，管理 sys_user 表所有账号的登录、权限认证
     */
    APP(PlatformEnum.APP.getPlatformId(), "app", "Authorization", "普通用户端"),
    /**
     * 用于：系统平台管理端-账号体系的的登录、权限认证
     * sys_user 会话对象，管理 用户类型=ad(超级管理端用户)的所有账号的登录、权限认证
     */
    SYS_MANAGE(PlatformEnum.SYS_MANAGE.getPlatformId(), "sys_manage", "Authorization-sys", "系统平台管理端"),
    /**
     * 用于：站点运营端-账号体系的的登录、权限认证
     * sys_user + sys_station_user_relation 会话对象，管理 sys_org_user_relation 表所有账号的登录、权限认证
     */
    STATION_MANAGE(PlatformEnum.STATION_MANAGE.getPlatformId(), "station_manage", "Authorization-s", "站点运营端"),
    /**
     * 用于：机构运营端-账号体系的的登录、权限认证
     * sys_user + sys_org_user_relation 会话对象，管理 sys_org_user_relation 表所有账号的登录、权限认证
     */
    ORG_MANAGE(PlatformEnum.ORG_MANAGE.getPlatformId(), "org_manage", "Authorization-o", "机构运营端"),
    ;

    /**
     * 平台id
     */
    private String platformId;

    /**
     * 平台-对应的登录类型
     */
    private final String loginType;
    /**
     * 登录类型对应的会话-Token name
     * 对应请求头的名称
     */
    private final String tokenName;
    /**
     * 登录类型描述
     */
    private final String desc;

    private static final Map<String, LoginTypeEnum> MAP;

    public static final Collection<String> TOKEN_NAME_HEADERS;

    static {
        MAP = new HashMap<>();
        for (LoginTypeEnum anEnum : values()) {
            MAP.put(anEnum.getLoginType(), anEnum);
        }
        ArrayList<String> list = new ArrayList<>();
        list.add(APP.getTokenName());
        list.add(STATION_MANAGE.getTokenName());
        list.add(ORG_MANAGE.getTokenName());
        list.add(SYS_MANAGE.getTokenName());
        TOKEN_NAME_HEADERS = CollectionUtil.unmodifiable(list);
    }

    LoginTypeEnum(String platformId, String loginType, String tokenName, String desc) {
        this.platformId = platformId;
        this.loginType = loginType;
        this.tokenName = tokenName;
        this.desc = desc;
    }

    public static LoginTypeEnum getEnumByLoginType(String loginType) {
        return MAP.get(loginType);
    }

    public static LoginTypeEnum getEnumByLoginType4Check(String loginType) {
        if (ObjectUtil.isEmpty(loginType)) {
            throw new ServiceException("登录类型不能为空");
        }
        LoginTypeEnum anEnum = getEnumByLoginType(loginType);
        if (Objects.nonNull(anEnum)) {
            return anEnum;
        }
        throw new ServiceException("登录类型错误");
    }
}